package br.ufms.cpcx.iara;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class Banco1 extends SQLiteOpenHelper {

	/**
	 * Este e o endereco onde o android salva os bancos de dados criado pela
	 * aplicacao, /data/data/<namespace da aplicacao>/databases/
	 */
	private static String DBPATH = "/data/data/br.ufms.cpcx.iara/databases/";

	// Este e o nome do banco de dados que iremos utilizar
	private static String DBNAME = "iara.db";

	private Context context;

	/**
	 * O construtor necessita do contexto da aplicao
	 */
	public Banco1(Context context) {
		/*
		 * O primeiro argumento e o contexto da aplicacao O segundo argumento e
		 * o nome do banco de dados O terceiro e um pondeiro para manipulacao de
		 * dados, e precisaremos dele. O quarto e a versao do banco de dados
		 */
		super(context, "iara.db", null, 2);
		this.context = context;
	}

	/**
	 * Os metodos onCreate e onUpgrade precisam ser sobreescrito
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		/*
		 * Estamos utilizando o banco do assets, por isso o codigo antigo deste
		 * metodo nao e mais necess�rio.
		 */
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		/*
		 * Estamos criando a primeira versao do nosso banco de dados, entao nao
		 * precisamos fazer nenhuma alteracao neste metodo.
		 */
	}

	/**
	 * Metodo auxiliar que verifica a existencia do banco da aplicacao.
	 */
	private boolean checkDataBase() {

		SQLiteDatabase db = null;

		try {
			String path = DBPATH + DBNAME;
			db = SQLiteDatabase.openDatabase(path, null,
					SQLiteDatabase.OPEN_READONLY);
			db.close();
		} catch (SQLiteException e) {
			// O banco nao existe
		}

		// Retorna verdadeiro se o banco existir, pois o ponteiro ira existir,
		// se nao houver referencia e porque o banco nao existe
		return db != null;
	}

	private void createDataBase() throws Exception {

		// Primeiro temos que verificar se o banco da aplicacao
		// ja foi criado
		boolean exists = checkDataBase();

		if (!exists) {
			// Chamaremos esse metodo para que o android
			// crie um banco vazio e o diretorio onde iremos copiar
			// no banco que esta no assets.
			this.getReadableDatabase();

			// Se o banco de dados nao existir iremos copiar o nosso
			// arquivo em /assets para o local onde o android os salva
			System.out.println("banco Criado");
			try {
				copyDatabase();
			} catch (IOException e) {
				throw new Error("Nao foi possivel copiar o arquivo");
			}

		}
	}

	/**
	 * Esse metodo e responsavel por copiar o banco do diretorio assets para o
	 * diretorio padrao do android.
	 */
	private void copyDatabase() throws IOException {

		String dbPath = DBPATH + DBNAME;

		// Abre o arquivo o destino para copiar o banco de dados
		OutputStream dbStream = new FileOutputStream(dbPath);

		// Abre Stream do nosso arquivo que esta no assets
		InputStream dbInputStream = context.getAssets().open("iara.db");

		byte[] buffer = new byte[1024];
		int length;
		while ((length = dbInputStream.read(buffer)) > 0) {
			dbStream.write(buffer, 0, length);
		}

		dbInputStream.close();

		dbStream.flush();
		dbStream.close();

	}

	public SQLiteDatabase getDatabase() {

		try {
			// Verificando se o banco ja foi criado e se nao foi o
			// mesmo e criado.
			createDataBase();

			// Abrindo database
			String path = DBPATH + DBNAME;

			return SQLiteDatabase.openDatabase(path, null,
					SQLiteDatabase.OPEN_READWRITE);
		} catch (Exception e) {
			// Se nao conseguir copiar o banco um novo sera retornado
			return getWritableDatabase();
		}

	}

	public Cursor buscar(String sql, Object object) {
		return getWritableDatabase().rawQuery(sql,null);
		
	}
}
